#include<iostream>
#include<vector>
using namespace std;
int main(){
    const int mod=1e9+7;
    string s;cin>>s;
    int n=s.size();
    vector<vector<long long>>dp(n,vector<long long>(3));
    dp[0][(s[0]-'0')%3]=1;
    for(int i=1;i<n;i++){
        int k=(s[i]-'0')%3;
        dp[i][k]=1;
        for(int j=0;j<3;j++){
            //dp[i][j]位置分为两种情况
            //1.不选这个值，则可余数为j的子序列是上一个余数为j子序列的个数
            //2.选这个值，则余数为j的子序列是上一个余数为j-k子序列的个数+它本身
            //假设是余数为x的子序列个数，那么x+k=j,所以x=j-k（注意可能是负数，所以要+3）;
            dp[i][j]+=(dp[i-1][j]+dp[i-1][(j-k+3)%3])%mod;
        }
    }
    cout<<dp[n-1][0]%mod;
}   

//方法二
//思路：遍历到字符串中的某个字符时，将前面余数为j的分别和这个字符相加并%3得到这个字符的各个余数的个数，当前一个某个余数的个数为0是不加
#include<iostream>
#include<vector>
using namespace std;
int main(){
    const int mod=1e9+7;
    string s;cin>>s;
    int n=s.size();
    vector<vector<int>>dp(n,vector<int>(3));
    dp[0][(s[0]-'0')%3]=1;
    for(int i=1;i<n;i++){
        int m=s[i]-'0';
        dp[i][0]=dp[i-1][0];
        dp[i][1]=dp[i-1][1];
        dp[i][2]=dp[i-1][2];
        for(int j=0;j<3;j++){
            if(dp[i-1][j]!=0){//前面余数为j的个数不为0时，与该值相加取模于3可得dp[i]余数为[(j+m)%3]的个数
                dp[i][(j+m)%3]=(dp[i][(j+m)%3]+dp[i-1][j])%mod;
            }
        }
        dp[i][m%3]=(dp[i][m%3]+1)%mod;
    }
    cout<<dp[n-1][0];
}
